package cn.lrwjz.androidguide.ui.exmple;

import android.os.Bundle;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;

import androidx.activity.EdgeToEdge;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;

import com.google.android.material.appbar.MaterialToolbar;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import org.json.JSONArray;
import org.json.JSONObject;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import cn.lrwjz.androidguide.R;
import cn.lrwjz.androidguide.adapter.PostAdapter;
import cn.lrwjz.androidguide.model.Post;
import cn.lrwjz.androidguide.util.HttpUtil;

/**
 * 网络权限的配置
 * 网络请求的封装
 * JSON数据的解析
 * UI的更新（Handler）
 * 错误处理
 * 异步操作
 *
 * 在实际开发中一般会更倾向于使用一些成熟的网络请求库，如OkHttp、Retrofit等
 */

public class HttpActivity extends AppCompatActivity {
    private SwipeRefreshLayout swipeRefreshLayout;
    private PostAdapter adapter;
    private List<Post> posts = new ArrayList<>();
    private View loadingContainer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_http);

        // 设置工具栏
        MaterialToolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        if (getSupportActionBar() != null) {
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            getSupportActionBar().setTitle("HTTP 示例");
        }

        // 初始化加载动画
        loadingContainer = findViewById(R.id.loading_container);

        // 设置RecyclerView
        RecyclerView recyclerView = findViewById(R.id.recycler_view);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        adapter = new PostAdapter(posts);
        recyclerView.setAdapter(adapter);

        // 设置下拉刷新
        swipeRefreshLayout = findViewById(R.id.swipe_refresh);
        swipeRefreshLayout.setOnRefreshListener(this::fetchPosts);

        // 初始加载数据
        fetchPosts();
    }

    private void showLoading() {
        // 首次打开页面
        if (!swipeRefreshLayout.isRefreshing()) {
            loadingContainer.setVisibility(View.VISIBLE);
        }
    }

    private void hideLoading() {
        loadingContainer.setVisibility(View.GONE);
        swipeRefreshLayout.setRefreshing(false);
    }

    private void fetchPosts() {
        // 显示加载动画
        showLoading();

        // 设置请求头
        Map<String, String> headers = new HashMap<>();
        headers.put("Content-Type", "application/json");

        // 发起GET请求
        HttpUtil.get("https://jsonplaceholder.typicode.com/posts", headers, new HttpUtil.HttpCallback() {
            @Override
            public void onSuccess(String response) {
                try {
                    posts.clear();

//                    JSONArray jsonArray = new JSONArray(response);
//                    for (int i = 0; i < jsonArray.length(); i++) {
//                        JSONObject jsonObject = jsonArray.getJSONObject(i);
//                        Post post = new Post();
//                        // 解析JSON数据，opt() 方法可以避免解析失败导致的崩溃，没有匹配键，则返回空
//                        post.setId(jsonObject.optInt("id"));
//                        post.setTitle(jsonObject.optString("title"));
//                        post.setBody(jsonObject.optString("body"));
//                        posts.add(post);
//
//                    }

                    // 创建 Gson 对象
                    Gson gson = new Gson();
                    // 定义 List<Post> 的类型
                    Type listType = new TypeToken<List<Post>>(){}.getType();
                    // 解析 JSON 数组
                    List<Post> postList = gson.fromJson(response, listType);
                    posts.addAll(postList);

                    adapter.notifyDataSetChanged();
                } catch (Exception e) {
                    Toast.makeText(HttpActivity.this, "解析数据失败：" + e.getMessage(), Toast.LENGTH_SHORT).show();
                }
                // 隐藏加载动画
                hideLoading();
            }

            @Override
            public void onError(Exception e) {
                Toast.makeText(HttpActivity.this, "请求失败：" + e.getMessage(), Toast.LENGTH_SHORT).show();
                // 隐藏加载动画
                hideLoading();
            }
        });
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        if (item.getItemId() == android.R.id.home) {
            finish();
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
} 